//
// Created by tracyhenry on 2022/7/18.
//

#include "tool.h"
#include <iostream>
#include <sstream>
#include <string>

using namespace std;

int towordlower(int c)
{
    if (c >= 'A' && c <= 'Z')
    {
        return c + 'a' - 'A';
    }
    else
    {
        return c;
    }
}



//Converts a hexadecimal string to an integer
int StrToDemicalData(string data)
{

if(data.empty()){
    return 0;
}

 
char* s = (char*)data.data();

    int i;
    int n = 0;
    if (*s == '0' && (*(s+1)=='x' || *(s+1)=='X'))
    {
        i = 2;
    }
    else
    {
        i = 0;
    }
    for (; (*(s+i) >= '0' && *(s+i) <= '9') || (*(s+i) >= 'a' && *(s+i) <= 'z') || (*(s+i) >='A' && *(s+i) <= 'Z');++i)
    {
        if (towordlower(*(s+i)) > '9')
        {
            n = 16 * n + (10 + towordlower(*(s+i)) - 'a');
        }
        else
        {
            n = 16 * n + (towordlower(*(s+i)) - '0');
        }
    }
    return n;
}


void longToStr(long x,char * s)
{
    if (x <= 0)
    {
        s[0] = '0';
        s[1] = '0';
        s[2] = '\0';
    } else{
        int i,j,c;
        char buf,buf1;
        for(i=(x<0?0:-1);x>0;)
        {
            s[++i]=x%16;
            x/=16;
        }
        for(j=i;j>=0;j--)
            if(s[j]<10)s[j]+=48;
            else s[j]+=55;
        s[i+1]='\0';
        for(j=0;j<i;j++,i--)
        {c=s[j];s[j]=s[i];s[i]=c;}

        if(strlen(s)%2==1){
            buf = *s;
            for(i=0;i<strlen(s);i++){
                if(i==0){
                    *(s+i) = '0';
                }else{
                    buf1 = *(s+i);
                    *(s+i) = buf;
                    buf = buf1;
                }
            }
            *(s+i) = buf;
        }
    }
}


string longtostring(long t)
{
    std::string result;
    stringstream ss;
    ss <<  t;
    ss >> result;
    return result;
}

//

//功能：二进制取反

//

//输入：const unsigned char *src 二进制数据

// int length 待转换的二进制数据长度

//

//输出：unsigned char *dst 取反后的二进制数据

//

//返回：0 success

//

//

int convert(unsigned char *dst, const unsigned char *src, int length)

{

int i;

for (i = 0; i < length; i++)

{

dst[i] = src[i] ^ 0xFF;

}

return 0;

}

//

//

//功能：十六进制转为十进制

//

//输入：const unsigned char *hex 待转换的十六进制数据

// int length 十六进制数据长度

//

//输出：

//

//返回：int rslt 转换后的十进制数据

//

//思路：十六进制每个字符位所表示的十进制数的范围是0 ~255，进制为256

// 左移8位(<<8)等价乘以256

//

unsigned long HextoDec(const unsigned char *hex, int length)

{

int i;

unsigned long rslt = 0;

for (i = 0; i < length; i++)

{

rslt += (unsigned long)(hex[i]) << (8 * (length - 1 - i));

}

return rslt;

}

//

//功能：十进制转十六进制

//

//输入：int dec 待转换的十进制数据

// int length 转换后的十六进制数据长度

//

//输出：unsigned char *hex 转换后的十六进制数据

//

//返回：0 success

//

//思路：原理同十六进制转十进制

//

int DectoHex(int dec, unsigned char *hex, int length)

{

int i;

for (i = length - 1; i >= 0; i--)

{

hex[i] = (dec % 256) & 0xFF;

dec /= 256;

}

return 0;

}


//

//功能：求权

//

//输入：int base 进制基数

// int times 权级数

//

//输出：

//

//返回：unsigned long 当前数据位的权

//

//

unsigned long power(int base, int times)

{

int i;

unsigned long rslt = 1;

for (i = 0; i < times; i++)

rslt *= base;

return rslt;

}


//

//功能：BCD转10进制

//

//输入：const unsigned char *bcd 待转换的BCD码

// int length BCD码数据长度

//

//输出：

//

//返回：unsigned long 当前数据位的权

//

//思路：压缩BCD码一个字符所表示的十进制数据范围为0 ~ 99,进制为100

// 先求每个字符所表示的十进制值，然后乘以权

//

unsigned long BCDtoDec(const unsigned char *bcd, int length)

{

int i, tmp;

unsigned long dec = 0;

for (i = 0; i < length; i++)

{

tmp = ((bcd[i] >> 4) & 0x0F) * 10 + (bcd[i] & 0x0F);

dec += tmp * power(100, length - 1 - i);

}

return dec;

}


//

//功能：十进制转BCD码

//

//输入：int Dec 待转换的十进制数据

// int length BCD码数据长度

//

//输出：unsigned char *Bcd 转换后的BCD码

//

//返回：0 success

//

//思路：原理同BCD码转十进制

//

//

int DectoBCD(int Dec, unsigned char *Bcd, int length)

{

int i;

int temp;

for (i = length - 1; i >= 0; i--)

{

temp = Dec % 100;

Bcd[i] = ((temp / 10) << 4) + ((temp % 10) & 0x0F);

Dec /= 100;

}

return 0;

}
